package com.bird.extension.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Author: sijunqiang
 * @Date: 2020/4/4 16:10
 * @Description: 使用反射的技术获取类中的构造方法
 */
public class ConstructorCollector {

    /**
     * 该main方法是通过反射的技术获取类中的构造方法
     */
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        //通过类的全路径获取ConstructorCollector这个类的大Class对象
        Class clazz =   Class.forName("com.bird.extension.reflect.ReflectTarget");
        System.out.println("********************所有的公有构造方法*****************************");
        //1: 获取所有的公有构造方法
        Constructor[] conArray = clazz.getConstructors();
        //遍历打印每一个共有的构造方法
        for (Constructor constructor : conArray) {
            System.out.println("constructor = " + constructor);
        }

         //get all constructor method
        System.out.println("**************get all constructor method contain( private protect default public method)******************");
        conArray = clazz.getDeclaredConstructors();
        for (Constructor constructor : conArray) {
            System.out.println("constructor = " + constructor);
        }

        //2:获取单个带有参数的共有方法
        System.out.println("********************获取共有, 带两个参数的构造方法*****************************");
        Constructor con = clazz.getConstructor(String.class, int.class );
        System.out.println("con=" + con);

        //3: 获取单个私有的构造方法
        System.out.println("*******************获取私有的构造方法******************");
        Constructor  declaredConstructor = clazz.getDeclaredConstructor(int.class);
        System.out.println("private declaredConstructor" + declaredConstructor);

        //4: 调用私有构造方法创建实例
        System.out.println("***********调用私有构造方法创建实例******************");
        //暴力访问(忽略访问的修饰符)
        declaredConstructor.setAccessible(true);
        ReflectTarget o = (ReflectTarget) declaredConstructor.newInstance(1);
    }

}
